#define _CRT_SECURE_NO_WARNINGS 1
#include "Date.h"

//>>运算符重载
istream& operator>>(istream& input, Date& d)
{
	cout << "请依次输入年月日->:";
	while (1)
	{
		input >> d._year >> d._month >> d._day;

		//判断输入的年月日是否合法
		if (d._month > 12 || d._month <1 || d._day>d.GetMonthDay() || d._day < 1)
		{
			cout << "非法日期，请重新输插入->:";
		}
		else
		{
			break;
		}
	}

	return input;
}

//<<运算符重载
ostream& operator<<(ostream& output, const Date& d)
{
	cout << d._year << "/" << d._month << "/" << d._day << endl;

	return output;
}

// >运算符重载
bool operator>(const Date& d1, const Date& d2)
{
	if (d1._year > d2._year)
	{
		return true;
	}
	else if (d1._year == d2._year)
	{
		if (d1._month > d2._month)
		{
			return true;
		}
		else if (d1._month == d2._month)
		{
			if (d1._day > d2._day)
			{
				return true;
			}
		}
	}
	return false;
}

// ==运算符重载
bool operator==(const Date& d1, const Date& d2)
{
	if (d1._year == d2._year
		&& d1._month == d2._month
		&& d1._day == d2._day)
	{
		return true;
	}
	return false;
}

// >=运算符重载
bool operator >= (const Date& d1, const Date& d2)
{
	return !(d1 < d2);
}

// <运算符重载
bool operator < (const Date& d1, const Date& d2)
{
	return !(d1 > d2 || d1 == d2);
}

// <=运算符重载
bool operator <= (const Date& d1, const Date& d2)
{
	return !(d1 > d2);
}

// !=运算符重载
bool operator != (const Date& d1, const Date& d2)
{
	return !(d1 == d2);
}

// 日期+天数
Date Date::operator+(int day)  const
{
	Date tmp = *this;

	tmp._day += day;
	while (tmp._day > tmp.GetMonthDay())
	{
		tmp._day -= tmp.GetMonthDay();
		tmp._month += 1;
		if (tmp._month > 12)
		{
			tmp._year += 1;
			tmp._month = 1;
		}
	}
	return tmp;
}

// 日期+=天数
Date& Date::operator+=(int day)
{
	*this = *this + day;
	return *this;
}

// 日期-天数
Date Date::operator-(int day)  const
{
	Date tmp = *this;

	tmp._day -= day;
	while (tmp._day < 1)
	{
		tmp._month -= 1;
		if (tmp._month < 1)
		{
			tmp._year -= 1;
			tmp._month = 12;
		}
		tmp._day += tmp.GetMonthDay();
	}
	return tmp;
}

// 日期-=天数
Date& Date::operator-=(int day)
{
	*this = *this - day;

	return *this;
}

// 前置++
Date& Date::operator++()
{
	return *this += 1;
}

// 后置++
Date Date::operator++(int)
{
	Date tmp = *this;
	*this += 1;
	return tmp;
}

// 后置--
Date Date::operator--(int)
{
	Date tmp = *this;
	*this -= 1;
	return tmp;
}

// 前置--
Date& Date::operator--()
{
	return *this -= 1;
}

// 日期-日期 返回天数
int operator-(const Date& d1, const Date& d2)
{
	int day = 0;

	Date max = d2;
	Date min = d1;
	int flag = 1;
	if (max < min)
	{
		max = d1;
		min = d2;
		flag = -1;
	}
	while (max > min)
	{
		min += 1;
		day += 1;
	}
	return flag*day;
}